iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
自我挑戰組

設計模式系列 第 28

Day28 - 子類沙箱(Subclass Sandbox)

  • 分享至 

  • xImage
  •  

介紹
子類使用基類定義的函式來實作功能。

多人撰寫軟體有時會遇到大家分工實作某類別的子類,但因實作類別的功能相近,可能部分的程式碼會被重複撰寫。此時可使用子類沙箱模式,把會共同用到的函式實作在基類,子類使用這些函式來實作各自的功能。

以下範例取自Game Programming Patterns一書。

C++範例

class Superpower
{
public:
  virtual ~Superpower() {}

protected:
  virtual void activate() = 0;

  void move(double x, double y, double z)
  {
    // Code here...
  }

  void playSound(SoundId sound, double volume)
  {
    // Code here...
  }

  void spawnParticles(ParticleType type, int count)
  {
    // Code here...
  }
};

class Superpower
{
protected:
  double getHeroX()
  {
    // Code here...
  }

  double getHeroY()
  {
    // Code here...
  }

  double getHeroZ()
  {
    // Code here...
  }

  // Existing stuff...
};

class SkyLaunch : public Superpower
{
protected:
  virtual void activate()
  {
    if (getHeroZ() == 0)
    {
      // On the ground, so spring into the air.
      playSound(SOUND_SPROING, 1.0f);
      spawnParticles(PARTICLE_DUST, 10);
      move(0, 0, 20);
    }
    else if (getHeroZ() < 10.0f)
    {
      // Near the ground, so do a double jump.
      playSound(SOUND_SWOOP, 1.0f);
      move(0, 0, getHeroZ() + 20);
    }
    else
    {
      // Way up in the air, so do a dive attack.
      playSound(SOUND_DIVE, 0.7f);
      spawnParticles(PARTICLE_SPARKLES, 1);
      move(0, 0, -getHeroZ());
    }
  }
};

Ref:
https://gameprogrammingpatterns.com/subclass-sandbox.html


上一篇
Day27 - 享元模式2(Flyweight pattern)
下一篇
Day29 - 事件列隊(Event Queue)
系列文
設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言